﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Management.Smo;

namespace ConnectSQLServer.Common
{
    public class DataTypeSQL
    {
        private string _name;
        private int _size;
        private DataType _type;
        static private int MAX = 2000;
        public int Size
        {
            get { return _size; }
            set { _size = value; }
        }
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        public DataType Type
        {
            get { return _type; }
            set { _type = value; }
        }
        static public DataType GetDataType(string type)
        {
            try
            {
                int index1 = type.IndexOf("(");
                int index2 = type.IndexOf(")");
                if (index1 != -1 && index2 != -1)
                {
                    string name = type.Substring(0, index1);
                    string sSize = type.Substring(index1 + 1, index2 - index1-1);
                    foreach (DataType dt in DataTypAll())
                    {
                        if (dt.Name == name)
                        {
                            if (sSize == "MAX")
                                dt.MaximumLength = DataTypeSQL.MAX;
                            else
                                dt.MaximumLength = int.Parse(sSize);
                            return dt;
                        }
                    }
                }
                else
                {
                    string name = type;
                    foreach (DataType dt in DataTypAll())
                    {
                        if (dt.Name == name)
                        {
                            return dt;
                        }
                    }
                }
                return null;
            }
            catch ( System.Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("Error: " + ex.Message, "Error Message",System.Windows.Forms.MessageBoxButtons.OK,  System.Windows.Forms.MessageBoxIcon.Asterisk);
                return null;
            }
        }
        static public List<DataType> DataTypAll()
        {
            List<DataType> lDataType = new List<DataType>();
            lDataType.Add(DataType.Bit);
            //lDataType.Add(DataType.Binary(50));
            lDataType.Add(DataType.BigInt);
            lDataType.Add(DataType.Char(50));
            lDataType.Add(DataType.Date);
            lDataType.Add(DataType.DateTime);
            lDataType.Add(DataType.Decimal(18, 0));
            lDataType.Add(DataType.Float);
            lDataType.Add(DataType.Image);
            lDataType.Add(DataType.Int);
            lDataType.Add(DataType.Money);
            lDataType.Add(DataType.NChar(10));
            lDataType.Add(DataType.NText);
            lDataType.Add(DataType.Numeric(18, 0));
            lDataType.Add(DataType.NVarChar(50));
            lDataType.Add(DataType.NVarCharMax);
            lDataType.Add(DataType.Real);
            lDataType.Add(DataType.SmallDateTime);
            lDataType.Add(DataType.SmallInt);
            lDataType.Add(DataType.SmallMoney);
            lDataType.Add(DataType.Text);
            lDataType.Add(DataType.Time(7));
            lDataType.Add(DataType.Timestamp);
            lDataType.Add(DataType.TinyInt);
            lDataType.Add(DataType.VarBinary(50));
            lDataType.Add(DataType.VarBinaryMax);
            lDataType.Add(DataType.VarChar(50));
            lDataType.Add(DataType.VarCharMax);
            return lDataType;
        }
        static public List<string> DataTypeSources()
        {
            List<string> lsDataType = new List<string>();
            lsDataType.Add("bigint");
            lsDataType.Add("binary(50)");
            lsDataType.Add("bit");
            lsDataType.Add("char(10)");
            lsDataType.Add("date");
            lsDataType.Add("datetime");
            lsDataType.Add("decimal(18,0)");
            lsDataType.Add("float");
            lsDataType.Add("image");
            lsDataType.Add("int");
            lsDataType.Add("money");
            lsDataType.Add("nchar(10)");
            lsDataType.Add("ntext");
            lsDataType.Add("numeric(18,0)");
            lsDataType.Add("nvarchar(50)");
            lsDataType.Add("nvarchar(MAX)");
            lsDataType.Add("real");
            lsDataType.Add("smalldatetime");
            lsDataType.Add("smallint");
            lsDataType.Add("smallmoney");
            lsDataType.Add("sql_variant");
            lsDataType.Add("text");
            lsDataType.Add("time(7)");
            lsDataType.Add("timestamp");
            lsDataType.Add("tinyint");
            lsDataType.Add("varbinary(50)");
            lsDataType.Add("varbinary(MAX)");
            lsDataType.Add("varchar(50)");
            lsDataType.Add("varchar(MAX)");
            return lsDataType;
        }
    }
}
